package com.mxwl.cbg.common.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;

public class JsonSafeUtils {



    /**
     * 安全地将 JSONObject 转换为目标类型
     *
     * @param jsonObject 源 JSON 对象
     * @param type       目标类型
     * @param <T>        泛型类型
     * @return 成功返回目标对象，失败返回 null
     */
    public static <T> T safeToObject(JSONObject jsonObject,  TypeReference<T> type) {
        return safeGetObject(jsonObject, null, type);
    }
    /**
     * 安全地从 JSONObject 中获取指定 key 的对象，并转换为目标类型
     *
     * @param jsonObject 源 JSON 对象
     * @param key        要获取的字段名
     * @param type       目标类型
     * @param <T>        泛型类型
     * @return 成功返回目标对象，失败返回 null
     */
    public static <T> T safeGetObject(JSONObject jsonObject, String key, TypeReference<T> type) {
        if (jsonObject == null) {
            return null;
        }
        if (key == null || key.isEmpty()) {
            return jsonObject.toJavaObject(type);
        }
        if (!jsonObject.containsKey(key)) {
            return null;
        }
        try {
            return jsonObject.getObject(key, type);
        } catch (Exception e) {
            // 可以换成日志记录
            System.err.println("解析字段 [" + key + "] 出错: " + e.getMessage());
            return null;
        }
    }

    /**
     * 安全地从 JSONObject 中获取指定 key 的对象，并根据子字段是否存在选择不同类型
     *
     * @param jsonObject       源 JSON 对象
     * @param key              要获取的字段名
     * @param flagField        判断使用哪个类型的标志字段
     * @param typeIfHasFlag    如果包含 flagField 使用此类型
     * @param typeIfNotHasFlag 如果不包含 flagField 使用此类型
     * @param <T>
     * @return 成功返回目标对象，失败返回 null
     */
    public static <T> T safeGetObjectWithFlag(
            JSONObject jsonObject,
            String key,
            String flagField,
            TypeReference<T> typeIfHasFlag,
            TypeReference<T> typeIfNotHasFlag) {

        if (jsonObject == null || !jsonObject.containsKey(key)) {
            return null;
        }

        try {
            JSONObject subObj = jsonObject.getJSONObject(key);
            if (subObj != null && subObj.containsKey(flagField)) {
                return jsonObject.getObject(key, typeIfHasFlag);
            } else {
                return jsonObject.getObject(key, typeIfNotHasFlag);
            }
        } catch (Exception e) {
            // 可以换成日志记录
            System.err.println("解析字段 [" + key + "] 出错: " + e.getMessage());
            return null;
        }
    }
}
